home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / MAILCFG.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-01  |  26KB  |  900 lines

  1. UNIT MailCfg;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Mail related configuration                    Last changed: 01.03.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-95 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32, OpField, OpString, OpWindow, OproUtil;
  16.  
  17. VAR
  18.   Save     : BOOLEAN;
  19.   ESR      : TPoPEntryScreen;
  20.  
  21. PROCEDURE GetEsrAndWin(EsrNum, Col: Byte; VAR Esr: TPoPEntryScreen; VAR Win: WindowPtr);
  22.  
  23. PROCEDURE NetMail;
  24. PROCEDURE EchoMail;
  25. PROCEDURE Nodes;
  26. PROCEDURE _NodesInit(VAR Buffer); far;
  27. PROCEDURE MiscOptions;
  28. PROCEDURE FilesToForward;
  29. PROCEDURE FwdMiscOptions;
  30.  
  31. PROCEDURE IncNodeStat(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  32. PROCEDURE IncFreeArea(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  33. PROCEDURE IncArcType(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  34. PROCEDURE EditOkFile;
  35.  
  36. PROCEDURE TickAreas;
  37. PROCEDURE TickMisc;
  38. PROCEDURE NodeListSegSetup;
  39.  
  40. PROCEDURE SchedulerSetup;
  41. PROCEDURE IncSCDAction(VAR Value; ID:WORD; Factor:Integer; VAR s:STRING);
  42. PROCEDURE IncAKAUsed(VAR Value; ID:WORD; Factor:Integer; VAR s:STRING);
  43.  
  44. PROCEDURE BrowseAreas;
  45. FUNCTION  Str2Bin(S: String; Var B: Byte): Boolean;
  46. FUNCTION  ValidateBin(EFP: EntryFieldPtr; Var ErrCode: Word; Var ErrorSt: StringPtr): Boolean;
  47. PROCEDURE BinConv(EFP: EntryFieldPtr; PostEdit: Boolean);
  48.  
  49. IMPLEMENTATION
  50.  
  51. USES Dos, OpCrt, OpDate, OpCmd, OpConst, OpEntry,
  52.      Globals, Input, Resource, StrUtil, NetFile, RBrowser, MailUtil,
  53.      PoPTypes, ArcView;
  54.  
  55. VAR
  56.   p : Pointer;
  57.  
  58.   PROCEDURE GetEsrAndWin(EsrNum, Col: Byte; VAR Esr: TPoPEntryScreen; VAR Win: WindowPtr);
  59.   BEGIN
  60.     GetEsr(EsrNum, Col, Esr);
  61.     MyWin(Win, 1, ScreenHeight-1, 80, ScreenHeight, Col, '', False);
  62.     WITH Win^, Cfg.Color[Col] DO
  63.     BEGIN
  64.       wFastText('F1=Help',1,2);
  65.     END;
  66.   END;
  67.  
  68.   FUNCTION BrowseHeader(i:BYTE):STRING;
  69.   VAR
  70.     s:STRING;
  71.   BEGIN
  72.     CASE i OF
  73.       1 : s:='Area name             GroupName   Area path';            { Tick }
  74.       2 : s:='Main area tag                    Description';           { Echo }
  75.       3 : s:='FileName      From             PopFixName  Description'; { Fwd }
  76.       4 : s:='Address          Lvl  Keys      BBS Open';               { Nodes }
  77.       5 : s:='Sta Magicname  Path                     '+               { Ok }
  78.              '   Password   Lvl Keys     Free';
  79.       6 : s:='Nodelist  Nodediff  New packed nodelist path';           { Nls }
  80.       7 : s:='Num Sub Action/Type          Send to'+CharStr(' ',39)+' S';   { Sched }
  81.       ELSE s:='';
  82.     END;
  83.     BrowseHeader:=CPad(s,78);
  84.   END;
  85.  
  86. {--- TickAreas --------------------------------------------------------------}
  87.  
  88.   PROCEDURE TickPostEdit(Esr: EntryScreenPtr); far;
  89.   BEGIN
  90.     CASE Esr^.GetCurrentID OF
  91.       3 : IF TestDirectoryPath(ESR^,TTickArea(P^).AreaPath,False) THEN Save:=True;
  92.       5 : IF TestDirectoryPath(ESR^,TTickArea(P^).AnnouncePath,False) THEN Save:=True;
  93.     END;
  94.     IF ESR^.CurrentFieldModified THEN Save:=True;
  95.   END;
  96.  
  97.   FUNCTION _GetTickStr(VAR Buffer; VAR f: TNetFile): String; far;
  98.   BEGIN
  99.     WITH TTickArea(Buffer) DO
  100.       _GetTickStr:=CPad(AreaName,22)+CPad(GroupName,12)+CPad(AreaPath,42);
  101.   END;
  102.  
  103.   PROCEDURE _EditTick(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  104.   BEGIN
  105.     Esr.Select;
  106.     Esr.SetNextField(0);
  107.     Save:=False;
  108.     REPEAT
  109.       Esr.Process;
  110.     UNTIL Esr.GetLastCommand IN [ccQuit,ccDone];
  111.     Changed:=Save;
  112.   END;
  113.  
  114.   PROCEDURE _InitTick(VAR Buffer); far;
  115.   BEGIN
  116.     FillChar(Buffer, SizeOf(TTickArea), 0);
  117.     WITH TTickArea(Buffer) DO
  118.     BEGIN
  119.       CheckCRC:=True;
  120.       FilesBBS:='FILES.BBS';
  121.       CheckDupe:=True;
  122.     END;
  123.   END;
  124.  
  125.   FUNCTION _IsGreaterTick(VAR B1,B2): Boolean; far;
  126.   BEGIN
  127.     _IsGreaterTick:=
  128.       Pad(TTickArea(B1).GroupName,10)+TTickArea(B1).AreaName>Pad(TTickArea(B2).GroupName,10)+TTickArea(B2).AreaName;
  129.   END;
  130.  
  131.   PROCEDURE TickAreas;
  132.   VAR
  133.     ExitCode : Word;
  134.     f        : TNetFile;
  135.  
  136.     PROCEDURE MakeTickScreen;
  137.     BEGIN
  138.       GetEsr(EsrTickSetup,2,Esr);
  139.       p:=Esr.GetUserRecord;
  140.       Esr.SetPostEditProc(TickPostEdit);
  141.       EntryCommands.addcommand(ccUser2,1,Word(256)*60,0);
  142.     END;
  143.  
  144.   BEGIN
  145.     f.Open(StartPath+PoPTickFileName,SizeOf(TTickArea),True);
  146.     MakeTickScreen;
  147.     BrowseRecords(f,P^,ExitCode,'Tick File',BrowseHeader(1),
  148.                   _GetTickStr,_EditTick,_InitTick,_IsGreaterTick);
  149.     Esr.Done;
  150.     f.Close;
  151.   END;
  152.  
  153. {--- Message Areas Setup ----------------------------------------------------}
  154.  
  155.   PROCEDURE BrowsePostEdit(Esr: EntryScreenPtr); far;
  156.   BEGIN
  157.     IF Esr^.CurrentFieldModified THEN Save:=True;
  158.     CASE Esr^.GetCurrentID OF
  159.       3 : BEGIN
  160.             IF (TMsgArea(p^).Directory='') And (ConFirm('Passthrough area?','Y',12)) THEN Exit;
  161. {           IF (TMsgArea(p^).Directory[2]=':') AND TestDirectoryPath(ESR^, TMsgArea(p^).Directory, False) THEN Save:=True; }
  162.           END;
  163.     END;
  164.   END;
  165.  
  166.   FUNCTION _GetEchoAreasStr(VAR Buffer; VAR f: TNetFile): String; far;
  167.   BEGIN
  168.     WITH TMsgArea(Buffer) DO
  169.       _GetEchoAreasStr:=CPad(EchoNames[1],33)+CPad(Description,40);
  170.   END;
  171.  
  172.   PROCEDURE _EditEchoAreas(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  173.   BEGIN
  174.     Esr.Select;
  175.     Esr.SetNextField(0);
  176.     Save:=False;
  177.     REPEAT
  178.       Esr.Process;
  179.     UNTIL Esr.GetLastCommand IN [ccQuit,ccDone];
  180.     Changed:=Save;
  181.   END;
  182.  
  183.   PROCEDURE _InitEchoAreas(VAR Buffer); far;
  184.   BEGIN
  185.     FillChar(Buffer,SizeOf(TMsgArea),0);
  186.   END;
  187.  
  188.   FUNCTION _IsGreaterEchoAreas(VAR B1,B2): Boolean; far;
  189.   BEGIN
  190.     _IsGreaterEchoAreas:=TMsgArea(B1).EchoNames[1]>TMsgArea(B2).EchoNames[1];
  191.   END;
  192.  
  193.   PROCEDURE BrowseAreas;
  194.   VAR
  195.     ExitCode  : Word;
  196.     AreasFile : TNetFile;
  197.  
  198.     PROCEDURE MakeEntryScreen;
  199.     BEGIN
  200.       GetEsr(EsrEchoAreas,2,Esr);
  201.       p:=Esr.GetUserRecord;
  202.       ESR.SetPostEditProc(BrowsePostEdit);
  203.       WITH EntryCommands DO
  204.       BEGIN
  205.         AddCommand(ccUser2,1,$3c00,0);
  206.         AddCommand(ccUser4,1,$3e00,0);
  207.         AddCommand(ccUser5,1,$3f00,0);
  208.         AddCommand(ccUser8,1,$4200,0);
  209.         AddCommand(ccUser9,1,$4300,0);
  210.       END;
  211.     END;
  212.  
  213.   BEGIN
  214.     AreasFile.Open(PoPMsgAreaFileName,SizeOf(TMsgArea),True);
  215.     MakeEntryScreen;
  216.     BrowseRecords(AreasFile,p^,ExitCode,'Echo areas',BrowseHeader(2),
  217.                  _GetEchoAreasStr,_EditEchoAreas,_InitEchoAreas,_IsGreaterEchoAreas);
  218.     Esr.Done;
  219.     AreasFile.Close;
  220.   END;
  221.  
  222. {--- Netmail setup ----------------------------------------------------------}
  223.  
  224.   PROCEDURE NetMailPostEdit(Esr: EntryScreenPtr); far;
  225.   BEGIN
  226.     WITH Esr^ DO
  227.     BEGIN
  228.       IF CurrentFieldModified THEN ConfigChanged:=True;
  229.       IF GetCurrentID=0 THEN
  230.         IF TestDirectoryPath(Esr^, Cfg.MailScanner.NetMailDir, True) THEN ConfigChanged:=True;
  231.     END;
  232.   END;
  233.  
  234.   PROCEDURE NetMail;
  235.   VAR
  236.     Win : WindowPtr;
  237.   BEGIN
  238.     GetEsrAndWin(EsrNetMailSetup, 2, Esr, Win);
  239.     WITH ESR DO
  240.     BEGIN
  241.       SetPostEditProc(NetMailPostEdit);
  242.       EntryCommands.addcommand(ccUser2,1,Word(256)*60,0);
  243.       REPEAT
  244.         Process;
  245.       UNTIL GetLastCommand IN [ccDone,ccQuit];
  246.     END;
  247.     Esr.Done;
  248.     KillWindow(Win);
  249.   END;
  250.  
  251.  
  252. {--- Echomail setup ---------------------------------------------------------}
  253.  
  254.   PROCEDURE EchoMailPostEdit(Esr: EntryScreenPtr); far;
  255.   BEGIN
  256.     WITH Esr^ DO
  257.     BEGIN
  258.       IF CurrentFieldModified THEN ConfigChanged:=True;
  259.       CASE GetCurrentID OF
  260.         0 : IF (GetLastCommand=ccUser2) AND SelectFile(Cfg.MailScanner.RouteFile) THEN ConfigChanged:=True;
  261.         1 : IF TestDirectoryPath(Esr^, Cfg.MailScanner.SaveDupesDir,True) THEN ConfigChanged:=True;
  262.       END;
  263.     END;
  264.   END;
  265.  
  266.   PROCEDURE EchoMail;
  267.   VAR
  268.     Win : WindowPtr;
  269.   BEGIN
  270.     GetEsrAndWin(EsrEchoMailSetup,2,Esr,Win);
  271.     WITH ESR DO
  272.     BEGIN
  273.       SetPostEditProc(EchoMailPostEdit);
  274.       EntryCommands.addcommand(ccUser2,1,Word(256)*60,0);
  275.       REPEAT
  276.         Process;
  277.       UNTIL GetLastCommand IN [ccDone,ccQuit];
  278.     END;
  279.     Esr.Done;
  280.     KillWindow(Win);
  281.   END;
  282.  
  283. {--- Files To Forward -------------------------------------------------------}
  284.  
  285.   PROCEDURE FwdPostEdit(Esr: EntryScreenPtr); far;
  286.   BEGIN
  287.     IF (ESR^.GetCurrentID=6) AND TestDirectoryPath(ESR^,TFileFwd(p^).WhereToPut,True) THEN Save:=True;
  288.     IF ESR^.CurrentFieldModified THEN Save:=True;
  289.   END;
  290.  
  291.   FUNCTION FwdGetString(VAR Buffer; VAR f: TNetFile): String; far;
  292.   BEGIN
  293.     WITH TFileFwd(Buffer) DO
  294.       FwdGetString:=CPad(FileName,14)+CPad(Address2Str(GetFrom),17)+
  295.                     CPad(PortalFixName,12)+CPad(Description,33);
  296.   END;
  297.  
  298.   PROCEDURE FwdEdit(VAR Buffer; VAR Changed: Boolean; RecNum,MaxRec: LongInt); far;
  299.   BEGIN
  300.     Esr.Select;
  301.     Esr.SetNextField(0);
  302.     Save:=False;
  303.     REPEAT
  304.       Esr.Process;
  305.     UNTIL ESR.GetLastCommand IN [ccDone,ccQuit];
  306.     Changed:=Save;
  307.   END;
  308.  
  309.   PROCEDURE FwdInitBuf(VAR Buffer); far;
  310.   BEGIN
  311.     FillChar(Buffer, SizeOf(TFileFwd),0);
  312.   END;
  313.  
  314.   FUNCTION FwdIsGreater(VAR B1,B2): Boolean; far;
  315.   BEGIN
  316.     FwdIsGreater:=TFileFwd(B1).FileName>TFileFwd(B2).FileName;
  317.   END;
  318.  
  319.   PROCEDURE FilesToForward;
  320.   VAR
  321.     FwdFile  : TNetFile;
  322.     ExitCode : Word ;
  323.  
  324.     PROCEDURE MakeFwdScreen;
  325.     BEGIN
  326.       GetEsr(EsrFileFwdSetup,2,Esr);
  327.       p:=Esr.GetUserRecord;
  328.       WITH EntryCommands, ESR DO
  329.       BEGIN
  330.         SetPostEditProc(FwdPostEdit);
  331.         EntryCommands.addcommand(ccUser2,1,Word(256)*60,0);
  332.       END;
  333.     END;
  334.  
  335.   BEGIN
  336.     FwdFile.Open(PoPFileFwdFileName,SizeOf(TFileFwd),True);
  337.     MakeFwdScreen;
  338.     BrowseRecords(FwdFile,p^,ExitCode,'Files to forward',BrowseHeader(3),
  339.                   FwdGetString,FwdEdit,FwdInitBuf,FwdIsGreater);
  340.     Esr.Done;
  341.     FwdFile.Close;
  342.   END;
  343.  
  344.  
  345. {--- File Forward Misc ------------------------------------------------------}
  346.  
  347.   PROCEDURE FwdMiscPostEdit(Esr: EntryScreenPtr); far;
  348.   BEGIN
  349.     WITH Esr^ DO
  350.     BEGIN
  351.       IF CurrentFieldModified THEN ConfigChanged:=True;
  352.       CASE GetCurrentID OF
  353.         0 : IF TestDirectoryPath(Esr^,Cfg.FwdFile.SecureDir,True) THEN ConfigChanged:=True;
  354.       END;
  355.     END;
  356.   END;
  357.  
  358.   PROCEDURE FwdMiscOptions;
  359.   VAR
  360.     Win : WindowPtr;
  361.   BEGIN
  362.     GetEsrAndWin(EsrFileFwdMisc,2,Esr,Win);
  363.     WITH Esr DO
  364.     BEGIN
  365.       SetPostEditProc(FwdMiscPostEdit);
  366.       REPEAT
  367.         Process;
  368.       UNTIL GetLastCommand IN [ccQuit,ccDone];
  369.     END;
  370.     Esr.Done;
  371.     KillWindow(Win);
  372.   END;
  373.  
  374. {--- Nodes Setup ------------------------------------------------------------}
  375.  
  376.   PROCEDURE NodePostEdit(Esr: EntryScreenPtr); far;
  377.   VAR
  378.     Ta:TTickArea;
  379.     fw:TFileFwd;
  380.     em:TMsgArea;
  381.   BEGIN
  382.     CASE Esr^.GetCurrentID OF
  383.        3 : IF NodesRec.Address.Point<>0 THEN ESR^.ChangeProtection(4, On) ELSE
  384.              ESR^.ChangeProtection(4,Off);
  385.        9 : IF Esr^.GetLastCommand=ccUser2 THEN
  386.            BEGIN
  387.              MultiSelect(NodesRec.Address,'Echo mail areas',BrowseHeader(2),
  388.                          'ARE',em,SizeOf(TMsgArea),em.SendTo,_GetEchoAreasStr,Esr);
  389.            END;
  390.       10 : IF Esr^.GetLastCommand=ccUser2 THEN
  391.            BEGIN
  392.              MultiSelect(NodesRec.Address,'Files to forward',BrowseHeader(3),
  393.                          'FWD',fw,SizeOf(TFileFwd),fw.SendTo,FwdGetString,Esr);
  394.            END;
  395.       12 : IF Esr^.GetLastCommand=ccUser2 THEN
  396.            BEGIN
  397.              MultiSelect(NodesRec.Address,'Tick areas',BrowseHeader(1),'TIC',
  398.                          Ta,SizeOf(TTickArea),Ta.GetFrom,_GetTickStr,Esr);
  399.           END;
  400.       ELSE
  401.       IF Esr^.GetLastCommand=ccUser2 THEN
  402.       BEGIN
  403.         Esr^.SetNextField(Esr^.GetCurrentID);
  404.         Esr^.SetLastCommand(ccNone);
  405.       END;
  406.     END;
  407.     IF ESR^.CurrentFieldModified THEN Save:=True;
  408.   END;
  409.  
  410.   FUNCTION Str2Bin(S: String; Var B: Byte): Boolean;
  411.   VAR
  412.     i, Bin : Byte;
  413.  
  414.   FUNCTION BinMag(b:BYTE):BYTE;
  415.   BEGIN
  416.     BinMag:=$80 SHR (i-1);
  417.   END;
  418.  
  419.   BEGIN
  420.     Str2Bin:=False;
  421.     Bin:=0;
  422.     s:=LeftPadCh(s,'0',8);
  423.     FOR i:=1 TO 8 DO
  424.       IF s[i]='1' THEN Inc(Bin,BinMag(i)) ELSE
  425.         IF S[i]<>'0' THEN Exit;
  426.     Str2Bin:=True;
  427.     B:=Bin;
  428.   END;
  429.  
  430.   FUNCTION ValidateBin(EFP: EntryFieldPtr; Var ErrCode: Word; Var ErrorSt: StringPtr): Boolean;
  431.   VAR
  432.     Flag:BOOLEAN;
  433.     B: Byte;
  434.     S: String[80];
  435.   BEGIN
  436.     ValidateBin:=False;
  437.     WITH EFP^ DO
  438.     BEGIN
  439.       StripPicture(efEditSt^,s);
  440.       CASE efPicture^[1] OF
  441.         '1' : Flag:=Str2Bin(s,b);
  442.         '2' : BEGIN
  443.                 Flag:=True;
  444.                 FOR b:=1 TO 8 DO
  445.                   IF NOT (s[b] IN ['Y','N']) THEN Flag:=False;
  446.               END;
  447.       END;
  448.       IF Not Flag THEN
  449.       BEGIN
  450.         ErrCode:=ecBadFormat;
  451.         ErrorSt:=@emInvalidNumber;
  452.       END ELSE
  453.         ValidateBin:=True;
  454.     END;
  455.   END;
  456.  
  457.   PROCEDURE BinConv(EFP: EntryFieldPtr; PostEdit: Boolean);
  458.   VAR
  459.     s: String[80];
  460.     i:BYTE;
  461.     n:integer;
  462.     ch:CHAR;
  463.   BEGIN
  464.     WITH EFP^ DO
  465.     BEGIN
  466.       IF PostEdit THEN
  467.       BEGIN
  468.         StripPicture(efEditSt^, s);
  469.         n:=1;
  470.         BYTE(efVarPtr^):=0;
  471.         FOR i:=1 TO 8 DO
  472.         BEGIN
  473.           CASE efPicture^[1] OF
  474.             '1' : IF s[i]='1' THEN INC(BYTE(efVarPtr^),n);
  475.             '2' : IF s[i]='Y' THEN INC(BYTE(efVarPtr^),n);
  476.           END;
  477.           n:=n SHL 1;
  478.         END;
  479.       END ELSE
  480.       BEGIN
  481.         s:='';
  482.         n:=1;
  483.         FOR i:=0 TO 7 DO
  484.         BEGIN
  485.           CASE efPicture^[1] OF
  486.             '1' : IF BYTE(efVarPtr^) AND n=n THEN ch:='1' ELSE ch:='0';
  487.             '2' : IF BYTE(efVarPtr^) AND n=n THEN ch:='Y' ELSE ch:='N';
  488.           END;
  489.           n:=n SHL 1;
  490.           s:=s+ch;
  491.         END;
  492.         MergePicture(s, efEditSt^);
  493.       END;
  494.     END;
  495.   END;
  496.  
  497.   FUNCTION _NodesGetStr(VAR Buffer; VAR f: TNetFile): String; far;
  498.   BEGIN
  499.     WITH TNodeInfo(Buffer) DO
  500.       _NodesGetStr:=CPad(Address2Str(Address),17)+LongIntForm('###',Level)+
  501.                     '  '+ReverseStr(BinaryB(Keys))+'  '+TimeToTimeString('hh:mm',OpenFrom)+
  502.                     ' - '+TimeToTimeString('hh:mm',OpenTo);
  503.   END;
  504.  
  505.   PROCEDURE IncArcType(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  506.   BEGIN
  507.     CASE Factor OF
  508.       +1: IF Byte(Value)<7 THEN Inc(Byte(Value)) ELSE Byte(Value):=0;
  509.       -1: IF Byte(Value)>0 THEN Dec(Byte(Value)) ELSE Byte(Value):=7;
  510.     END;
  511.     s:=PackerExtension(ShortInt(Value));
  512.   END;
  513.  
  514.   PROCEDURE _NodesEdit(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  515.   BEGIN
  516.     Esr.Select;
  517.     Esr.SetNextField(0);
  518.     IF NodesRec.Address.Point<>0 THEN ESR.ChangeProtection(4,On) ELSE ESR.ChangeProtection(4,Off);
  519.     Save:=False;
  520.     ESR.Process;
  521.     Changed:=Save;
  522.   END;
  523.  
  524.   PROCEDURE _NodesInit(VAR Buffer);
  525.   BEGIN
  526.     FillChar(Buffer, SizeOf(TNodeInfo),0);
  527.     TNodeInfo(Buffer).UseFullDuplex:=' ';
  528.     TNodeInfo(Buffer).CheckConnect:=' ';
  529.     TNodeInfo(Buffer).UseFake:=' ';
  530.     TNodeInfo(Buffer).Flavor:='H';
  531.     TNodeInfo(Buffer).UseEMSI:=' ';
  532.     TNodeInfo(Buffer).SendFwdLetter:=True;
  533.   END;
  534.  
  535.   FUNCTION _NodesIsGreater(VAR B1,B2): Boolean; far;
  536.   BEGIN
  537.     _NodesIsGreater:=Address2Sort(TNodeInfo(B1).Address)>Address2Sort(TNodeInfo(B2).Address);
  538.   END;
  539.  
  540.   PROCEDURE Nodes;
  541.   VAR
  542.     NodesFile   : TNetFile;
  543.     ExitCode    : Word;
  544.  
  545.     PROCEDURE MakeNodesScreen;
  546.     BEGIN
  547.       GetEsr(EsrNodesSetup,2,Esr);
  548.       WITH EntryCommands,Esr DO
  549.       BEGIN
  550.         SetPostEditProc(NodePostEdit);
  551.         EntryCommands.addcommand(ccUser2,1,Word(256)*60,0);
  552.       END;
  553.     END;
  554.  
  555.   BEGIN
  556.     NodesFile.Open(StartPath+PoPNodesFileName,SizeOf(TNodeInfo),True);
  557.     MakeNodesScreen;
  558.  
  559.     BrowseRecords(NodesFile,NodesRec,ExitCode,'Nodes Setup',BrowseHeader(4),
  560.                  _NodesGetStr,_NodesEdit,_NodesInit,_NodesIsGreater);
  561.  
  562.     Esr.Done;
  563.     NodesFile.Close;
  564.     DisposeNodesIdx;
  565.   END;
  566.  
  567. {--- Mailscanner Misc Options -----------------------------------------------}
  568.  
  569.   PROCEDURE MailScanMiscPostEdit(Esr: EntryScreenPtr); far;
  570.   BEGIN
  571.     WITH Esr^ DO
  572.     BEGIN
  573.       IF CurrentFieldModified THEN ConfigChanged:=True;
  574.       CASE GetCurrentID OF
  575.         0 : IF TestDirectoryPath(Esr^,Cfg.MailScanner.BadMsgs,True) THEN ConfigChanged:=True;
  576.       END;
  577.     END;
  578.   END;
  579.  
  580.   PROCEDURE MiscOptions;
  581.   VAR
  582.     Win : WindowPtr;
  583.   BEGIN
  584.     GetEsrAndWin(EsrMailScanMisc,2,Esr,Win);
  585.     WITH Esr DO
  586.     BEGIN
  587.       SetPostEditProc(MailScanMiscPostEdit);
  588.       REPEAT
  589.         Process;
  590.       UNTIL GetLastCommand IN [ccQuit,ccDone];
  591.     END;
  592.     Esr.Done;
  593.     KillWindow(Win);
  594.   END;
  595.  
  596.  
  597. {--- OkFile Setup -----------------------------------------------------------}
  598.  
  599.   FUNCTION NStatStr(Stat: TNodeStat): S3;
  600.   BEGIN
  601.     CASE Stat OF
  602.       nsUnKnown : NStatStr:='All';
  603.       nsKnown   : NStatStr:='Kwn';
  604.       nsPassword: NStatStr:='Pwd';
  605.     END;
  606.   END;
  607.  
  608.   PROCEDURE IncNodeStat(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  609.   BEGIN
  610.     CASE Factor OF
  611.       +1: IF Byte(Value)<2 THEN Inc(Byte(Value)) ELSE Byte(Value):=0;
  612.       -1: IF Byte(Value)>0 THEN Dec(Byte(Value)) ELSE Byte(Value):=2;
  613.     END;
  614.     s:=NStatStr(TNodeStat(Value));
  615.   END;
  616.  
  617.   FUNCTION FreeAreaStr(CONST FreeArea: TFreeArea): S9;
  618.   BEGIN
  619.     CASE FreeArea OF
  620.       faNoWay    : FreeAreaStr:='No way!  ';
  621.       faIfAccess : FreeAreaStr:='If access';
  622.       faTotally  : FreeAreaStr:='Totally  ';
  623.       ELSE         FreeAreaStr:='?????????';
  624.     END;
  625.   END;
  626.  
  627.   PROCEDURE IncFreeArea(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  628.   BEGIN
  629.     CASE Factor OF
  630.       +1: IF Byte(Value)<2 THEN Inc(Byte(Value)) ELSE Byte(Value):=0;
  631.       -1: IF Byte(Value)>0 THEN Dec(Byte(Value)) ELSE Byte(Value):=2;
  632.     END;
  633.     s:=FreeAreaStr(TFreeArea(Value));
  634.   END;
  635.  
  636.   PROCEDURE OkPostEdit(Esr: EntryScreenPtr); far;
  637.   BEGIN
  638.     IF ESR^.CurrentFieldModified THEN Save:=True;
  639.   END;
  640.  
  641.   FUNCTION _GetOkStr(VAR Buffer; VAR f: TNetFile): String; far;
  642.   BEGIN
  643.     WITH TOkFile(Buffer) DO
  644.       _GetOkStr:=NStatStr(NodeStat)+' '+CPad(MagicName,11)+CPad(FilePath,28)+
  645.                  CPad(Password,11)+LongIntForm('###',Level)+' '+ReverseStr(BinaryB(Keys))+' '+FreeAreaStr(FreeArea);
  646.   END;
  647.  
  648.   PROCEDURE _EditOk(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  649.   BEGIN
  650.     Esr.Select;
  651.     Esr.SetNextField(0);
  652.     Save:=False;
  653.     Esr.Process;
  654.     Changed:=Save;
  655.   END;
  656.  
  657.   PROCEDURE _InitOk(VAR Buffer); far;
  658.   BEGIN
  659.     FillChar(Buffer, SizeOf(TOkFile), 0);
  660.   END;
  661.  
  662.   FUNCTION _IsGreaterOk(VAR B1,B2): Boolean; far;
  663.   VAR
  664.     M1, M2 : S20;
  665.   BEGIN
  666.     IF TOkFile(B1).MagicName='' THEN M1:=CharStr(#255, 20) ELSE M1:=TOkFile(B1).MagicName;
  667.     IF TOkFile(B2).MagicName='' THEN M2:=CharStr(#255, 20) ELSE M2:=TOkFile(B2).MagicName;
  668.     _IsGreaterOk:=M1+TOkFile(B1).FilePath>M2+TOkFile(B2).FilePath;
  669.   END;
  670.  
  671.   PROCEDURE EditOkFile;
  672.   VAR
  673.     ExitCode : Word;
  674.     f        : TNetFile;
  675.  
  676.     PROCEDURE MakeOkFileScreen;
  677.     BEGIN
  678.       GetEsr(EsrOkFileSetup,2,Esr);
  679.       p:=Esr.GetUserRecord;
  680.       Esr.SetPostEditProc(OkPostEdit);
  681.     END;
  682.  
  683.   BEGIN
  684.     f.Open(StartPath+PoPOkFileName,SizeOf(TOkFile),True);
  685.     MakeOkFileScreen;
  686.     BrowseRecords(f,p^,ExitCode,'OK FILE',BrowseHeader(5),
  687.                   _GetOkStr,_EditOk,_InitOk,_IsGreaterOk);
  688.     Esr.Done;
  689.     f.Close;
  690.   END;
  691.  
  692. {--- Tick Misc --------------------------------------------------------------}
  693.  
  694.   PROCEDURE TickMiscPostEdit(Esr: EntryScreenPtr); far;
  695.   BEGIN
  696.     IF Esr^.CurrentFieldModified THEN ConfigChanged:=TRUE;
  697.     CASE Esr^.GetCurrentID OF
  698.       0 : IF TestDirectoryPath(Esr^,Cfg.Tick.DupeDir, True) THEN ConfigChanged:=True;
  699.       1 : IF TestDirectoryPath(Esr^,Cfg.Tick.HoldDir, True) THEN ConfigChanged:=True;
  700.     END;
  701.     IF ESR^.CurrentFieldModified THEN Save:=True;
  702.   END;
  703.  
  704.   PROCEDURE TickMisc;
  705.   VAR
  706.     Win : WindowPtr;
  707.   BEGIN
  708.     GetEsrAndWin(EsrMiscTickSetup, 2, Esr, Win);
  709.     WITH Esr DO
  710.     BEGIN
  711.       SetPostEditProc(TickMiscPostEdit);
  712.       EntryCommands.addcommand(ccUser2,1,Word(256)*60,0);
  713.       REPEAT
  714.         Process;
  715.       UNTIL GetLastCommand IN [ccDone,ccQuit];
  716.     END;
  717.     Esr.Done;
  718.     KillWindow(Win);
  719.   END;
  720.  
  721.  
  722. {--- Nodelist Segments ------------------------------------------------------}
  723.  
  724.   PROCEDURE NLSPostEdit(Esr: EntryScreenPtr); far;
  725.   BEGIN
  726.     IF (ESR^.GetCurrentID=4) AND
  727.        TestDirectoryPath(ESR^,TNodeListSeg(p^).NewNLPath,True) THEN Save:=True;
  728.     IF ESR^.CurrentFieldModified THEN Save:=True;
  729.   END;
  730.  
  731.   FUNCTION _GetNLSStr(VAR Buffer; VAR f: TNetFile): String; far;
  732.   BEGIN
  733.     WITH TNodeListSeg(Buffer) DO
  734.       _GetNLSStr:=CPad(NodeListName,10)+CPad(DiffFileName,10)+CPad(NewNlPath,42);
  735.   END;
  736.  
  737.   PROCEDURE _EditNLS(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  738.   BEGIN
  739.     Esr.Select;
  740.     Esr.SetNextField(0);
  741.     Save:=False;
  742.     REPEAT
  743.       Esr.Process;
  744.     UNTIL Esr.GetLastCommand IN [ccQuit,ccDone];
  745.     Changed:=Save;
  746.   END;
  747.  
  748.   PROCEDURE _InitNLS(VAR Buffer); far;
  749.   BEGIN
  750.     FillChar(Buffer,SizeOf(TNodeListSeg),0);
  751.   END;
  752.  
  753.   FUNCTION _IsGreaterNLS(VAR B1,B2): Boolean; far;
  754.   BEGIN
  755.     _IsGreaterNLS:=TNodeListSeg(B1).NodeListName>TNodeListSeg(B2).NodeListName;
  756.   END;
  757.  
  758.   PROCEDURE NodeListSegSetup;
  759.   VAR
  760.     ExitCode : Word;
  761.     f        : TNetFile;
  762.  
  763.     PROCEDURE MakeNLSScreen;
  764.     BEGIN
  765.       GetEsr(EsrNodeListSeg,2,Esr);
  766.       p:=Esr.GetUserRecord;
  767.       Esr.SetPostEditProc(NLSPostEdit);
  768.       EntryCommands.addcommand(ccUser2,1,Word(256)*60,0);
  769.     END;
  770.  
  771.   BEGIN
  772.     f.Open(StartPath+PoPNLSegmentFileName,SizeOf(TNodeListSeg),True);
  773.     MakeNLSScreen;
  774.     BrowseRecords(f,p^,ExitCode,'Nodelist segments',BrowseHeader(6),
  775.                   _GetNLSStr,_EditNLS,_InitNLS,_IsGreaterNLS);
  776.     Esr.Done;
  777.     f.Close;
  778.   END;
  779.  
  780.   { NodelistSeg: End ======================================================== }
  781.  
  782.   { Scheduler: Start ------------------------------------------------------ }
  783.  
  784.   FUNCTION ActionName(i: BYTE):S10;
  785.   VAR
  786.     s:S20;
  787.   BEGIN
  788.     CASE i OF
  789.       0 : s:='Poll';
  790.       1 : s:='Change';
  791.       2 : s:='Route';
  792.       3 : s:='Pack';
  793.       4 : s:='Kill Poll';
  794.     END;
  795.     ActionName:=s;
  796.   END;
  797.  
  798.   PROCEDURE IncSCDAction(VAR Value; ID:WORD; Factor:Integer; VAR s:STRING);
  799.   CONST
  800.     MaxType=4;
  801.   BEGIN
  802.     CASE Factor OF
  803.       +1 : BEGIN
  804.              INC(ShortInt(Value));
  805.              IF ShortInt(Value)>MaxType THEN ShortInt(Value):=0;
  806.            END;
  807.       -1 : BEGIN
  808.              DEC(ShortInt(Value));
  809.              IF ShortInt(Value)<0 THEN ShortInt(Value):=MaxType;
  810.            END;
  811.     END;
  812.     s:=ActionName(BYTE(Value));
  813.   END;
  814.  
  815.   PROCEDURE IncAKAUsed(VAR Value; ID:WORD; Factor:Integer; VAR s:STRING);
  816.   VAR
  817.     x:BYTE;
  818.   BEGIN
  819.     REPEAT
  820.       CASE Factor OF
  821.         +1 : BEGIN
  822.                INC(ShortInt(Value));
  823.                IF ShortInt(Value)>MaxAddresses THEN ShortInt(Value):=0;
  824.              END;
  825.         -1 : BEGIN
  826.                DEC(ShortInt(Value));
  827.                IF ShortInt(Value)<0 THEN ShortInt(Value):=MaxAddresses;
  828.              END;
  829.       END;
  830.       x:=BYTE(Value);
  831.       IF x=0 THEN x:=Cfg.MainAdrNum;
  832.     UNTIL (Cfg.Addresses[x].Zone<>0) OR (Factor=0);
  833.     IF BYTE(Value)=0 THEN s:='(DEFAULT)'
  834.                      ELSE s:=Address2Str(Cfg.Addresses[x]);
  835.   END;
  836.  
  837.   FUNCTION _GetSCDStr(VAR Buffer; VAR f: TNetFile): String; far;
  838.   BEGIN
  839.     WITH TSchedule(Buffer) DO
  840.       _GetSCDStr:=LongIntForm('###',Number)+' '+LongIntForm('###',SubLine)+' '+
  841.                   CPad(ActionName(Action),21)+CPad(Adr[1],46)+' '+Stat;
  842.   END;
  843.  
  844.   PROCEDURE SCDPostEdit(Esr: EntryScreenPtr); far;
  845.   BEGIN
  846.     IF ESR^.CurrentFieldModified THEN Save:=True;
  847.   END;
  848.  
  849.   PROCEDURE _EditSCD(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  850.   BEGIN
  851.     Esr.Select;
  852.     Esr.SetNextField(0);
  853.     Save:=False;
  854.     REPEAT
  855.       Esr.Process;
  856.     UNTIL Esr.GetLastCommand IN [ccQuit,ccDone];
  857.     Changed:=Save;
  858.   END;
  859.  
  860.   PROCEDURE _InitSCD(VAR Buffer); far;
  861.   BEGIN
  862.     FillChar(Buffer,SizeOf(TSchedule),0);
  863.     TSchedule(Buffer).Stat:='H';
  864.   END;
  865.  
  866.   FUNCTION _IsGreaterSCD(VAR B1,B2): Boolean; far;
  867.  
  868.     FUNCTION Key(VAR B):S2;
  869.     BEGIN
  870.       Key:=CHAR(TSchedule(B).Number)+CHAR(TSchedule(B).SubLine);
  871.     END;
  872.  
  873.   BEGIN
  874.     _IsGreaterSCD:=Key(B1)>Key(B2);
  875.   END;
  876.  
  877.   PROCEDURE SchedulerSetup;
  878.   VAR
  879.     ExitCode : Word;
  880.     f        : TNetFile;
  881.  
  882.     PROCEDURE MakeSCDScreen;
  883.     BEGIN
  884.       GetEsr(EsrScheduleSetUp,2,Esr);
  885.       Esr.SetPostEditProc(SCDPostEdit);
  886.       p:=Esr.GetUserRecord;
  887.     END;
  888.  
  889.   BEGIN
  890.     f.Open(StartPath+PoPScheduleFileName,SizeOf(TSchedule),True);
  891.     MakeSCDScreen;
  892.     BrowseRecords(f,p^,ExitCode,'Scheduler SetUp',BrowseHeader(7),
  893.                   _GetSCDStr,_EditSCD,_InitSCD,_IsGreaterSCD);
  894.     Esr.Done;
  895.     f.Close;
  896.   END;
  897.  
  898.  
  899. END.
  900.